package action;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import model.DAO;
import model.Program;
import searcher.Searcher;

/**
 * 
 * @author 胡伟
 *
 * 控制层, 完成连接视图层和模型层的方法操作
 */
public class Action {
	
	/**
	 * 完成爬取信息并将信息存入本地文本文件中
	 */
	public static void Search() {
		
		new Searcher().getPrograms();

	}
	

	
	/**
	 * 将默认的本地文件数据写入数据库中
	 * @return void
	 */
	public static void pushIntoDBFromLocalFile(){
		try {
			DAO.pushIntoDBFromLocalFile();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	
	/**
	 * 将指定的本地文件数据写入数据库中
	 * @return void
	 */
	public static void  pushIntoDBFromLocalFile(String path){
		try {
			DAO.pushIntoDBFromLocalFile(path);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 向数据库添加一条记录
	 */
	public static void addRecord(Program p) {
		try {
			DAO.addProgram(p);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 获取一条UUID
	 */
	public static String getRandomNumber() {
		UUID uuid = UUID.randomUUID();
		String id = uuid.toString().replaceAll("-","");
		id = id.toUpperCase();
		return id;
	}
	
	
	/**
	 * 根据查询字向数据库发起查询
	 * @param queryStatment
	 * @return 查询成功则返回 List<Program>,可能为空, 异常则返回 null
	 * 
	 */
	public static List<Program> query(String queryStatment) {
		try {
			if(queryStatment.isEmpty())	return DAO.queryProgram(queryStatment);
			
			//判断查询关键字是否是全大写字母, 如果是认为很有可能是缩写形式
			boolean ifAllCapital = true;
			for(int index = 0;index<queryStatment.length();index++)
			{
				if(queryStatment.charAt(index)<65||queryStatment.charAt(index)>90) {
					//testcode -- 0
				//	System.out.println(queryStatment.charAt(index));
					//testcode -- 1
					
					ifAllCapital = false;
					break;
				}
			}
		
			if(ifAllCapital) { // 如果全大写, 每个字符都去查询一次, 最后收集所有查询集的相同集. 如果program 的 id 字段相同则认为两条记录相同
				List<List<Program>> programLists = new ArrayList<List<Program>>();
				for(int index=0;index<queryStatment.length();index++)
				{
					List<Program> temp = DAO.queryProgram(queryStatment.charAt(index)+""); // 利用自动封装机制, 将char转成 String
					programLists.add(temp);
				}//这样就获得所有查询集,接下来要收集相同集
				List<Program> theSame = new ArrayList<Program>();// 用它存储相同集
				List<Program> theSame1 = programLists.get(0);// 初始化临时性的相同集, 用它来比较
				boolean isEmpty = false; // 记录相同集是否为空, 如果为空则认为所有查询集中不可能找到相同集
				for(int i=0;i<programLists.size();i++)
				{
					for(int j=0;j<theSame1.size();j++)
					{
						for(int k=0;k<programLists.get(i).size();k++)
						{
							if(theSame1.get(j).getId().equals(programLists.get(i).get(k).getId())) {
								theSame.add(theSame1.get(j));
							}
						}
					}
					if(theSame.size()==0) {
						isEmpty = true;
						break;
					}
					theSame1 = new ArrayList<Program>(theSame);
					theSame.removeAll(theSame);
				}
				//testcode -- 0
//				for(Program p:theSame1)
//				{
//					System.out.println(p.toString());
//				}
				//testcode -- 1
				return theSame1;
			}else {
				//testcode -- 0
//			//	System.out.println("queryStatment: "+queryStatment);
				//testcode -- 1
				return DAO.queryProgram(queryStatment);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	
	/*
	 * 列表中被选中的项目, 实际是以一个长字符串的显示信息的. 此函数能从传入的字符串中提取Program信息
	 * @return 成功提取返回包含信息的Program对象, 异常则返回null
	 */
	public static Program parseSelectedlString2Program(String s) {
		String pattern = "id="+"(.*)" +"\t"
				+"country="+"(.*)" +"\t"
				+"university="+"(.*)" +"\t"
				+"school="+"(.*)" +""+"\t"
				+"programName="+"(.*)" +"\t"
				+"homepage="+"(.*)" +"\t"
				+"location="+"(.*)" +"\t"
				+"email="+"(.*)" +"\t"
				+"phoneNumber="+"(.*)" +"\t"
				+"degree="+"(.*)" +"\t"
				+"deadlineWithAid="+"(.*)" +"\t"
				+"deadlineWithoutAid="+"(.*)";
		Pattern pa = Pattern.compile(pattern);
		
		Matcher m = pa.matcher(s);
		if(m.find()) {
			Program p = new Program();
			
			p.setId(m.group(1));
			p.setCountry(m.group(2));
			p.setUniversity(m.group(3));
			p.setSchool(m.group(4));
			p.setProgramName(m.group(5));
			p.setHomepage(m.group(6));
			p.setLocation(m.group(7));
			p.setEmail(m.group(8));
			p.setPhoneNumber(m.group(9));
			p.setDegree(m.group(10));
			p.setDeadlineWithAid(m.group(11));
			p.setDeadlineWithoutAid(m.group(12));
			
			return p;
		}else {
			System.out.println("Not Found");
		}
		return null;
	}
	
	
	/**
	 * 删除数据库中与 p 相匹配的一条记录
	 * @param p
	 * @throws SQLException
	 */
	public static void delete(Program p) {
		try {
			DAO.deleteProgram(p);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 更新数据库中一条与prev相匹配的记录, 替换为 replacement
	 * @param replacement
	 * @param prev
	 */
	public static void update(Program replacement,Program prev) {
		try {
			DAO.deleteProgram(prev);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			DAO.addProgram(replacement);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
